gdk: Make it possible to attach user data to GdkEvents
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 4 May 2017 11:41:29 +0000 (13:41 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 25 May 2017 14:25:59 +0000 (16:25 +0200)
As event->any.window is the toplevel, this is not useful anymore to
determine the window/widget that is the target for this event. Add
helper functions to attach user data to GdkEvents so the target
widget can be stored on the gtk/ side.

These calls should be made private with the rest of GdkEvent related
API.

gdk/gdkevents.c
gdk/gdkevents.h
gdk/gdkinternals.h

index ca72b9c75e3e68ff76242bc8657b7d4ba1b09a74..a3512b0883a5dee788f027cbf3aaf185df0f92ec 100644 (file)
@@ -663,6 +663,7 @@ gdk_event_copy (const GdkEvent *event)
       new_private->source_device = private->source_device ? g_object_ref (private->source_device) : NULL;
       new_private->seat = private->seat;
       new_private->tool = private->tool;
+      g_set_object (&new_private->user_data, private->user_data);
     }
 
   switch (event->any.type)
@@ -2577,3 +2578,28 @@ gdk_event_get_scancode (GdkEvent *event)
   private = (GdkEventPrivate *) event;
   return private->key_scancode;
 }
+
+void
+gdk_event_set_user_data (GdkEvent *event,
+                         GObject  *user_data)
+{
+  GdkEventPrivate *private;
+
+  if (!gdk_event_is_allocated (event))
+    return;
+
+  private = (GdkEventPrivate *) event;
+  g_set_object (&private->user_data, user_data);
+}
+
+GObject *
+gdk_event_get_user_data (GdkEvent *event)
+{
+  GdkEventPrivate *private;
+
+  if (!gdk_event_is_allocated (event))
+    return NULL;
+
+  private = (GdkEventPrivate *) event;
+  return private->user_data;
+}
index 8ff961377765692c657f52afc5b3884110c761eb..39cb761ecda5f0a21f567112e8ebc6def024872e 100644 (file)
@@ -1567,6 +1567,12 @@ int            gdk_event_get_scancode    (GdkEvent *event);
 GDK_AVAILABLE_IN_3_22
 gboolean       gdk_event_get_pointer_emulated (GdkEvent *event);
 
+GDK_AVAILABLE_IN_3_90
+void           gdk_event_set_user_data (GdkEvent *event,
+                                        GObject  *user_data);
+GDK_AVAILABLE_IN_3_90
+GObject *      gdk_event_get_user_data (GdkEvent *event);
+
 G_END_DECLS
 
 #endif /* __GDK_EVENTS_H__ */
index 6e0a37b62e400bae029c803340442ca2c1e9f6cf..56c26d28b56da8d7f98563f516149087f956abef 100644 (file)
@@ -150,6 +150,8 @@ struct _GdkEventPrivate
   GdkSeat   *seat;
   GdkDeviceTool *tool;
   guint16    key_scancode;
+
+  GObject *user_data;
 };
 
 typedef struct _GdkWindowPaint GdkWindowPaint;